package com.example.demo.listener;

import com.example.demo.entity.UserInfo;
import com.example.demo.service.UserInfoService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

import javax.servlet.ServletContext;
import java.util.List;

/**
 * 监听 Servlet 上下文对象
 * 使用 ApplicationListener 来初始化一些数据到 application 域中的监听器
 * @author LF
 * @date 2021/4/19 - 9:18
 */
@Component
public class MyServletContextListener implements ApplicationListener<ContextRefreshedEvent> {

    /**
     * 首先通过 contextRefreshedEvent 来获取 Application 上下文，再通过 Application 上下文获取 UserService 这个
     * Bean，项目中可以根据实际业务场景，也可以获取其他的 Bean，然后再调用自己的业务代码获取相应的数据，最后存储到 Application 域中，
     * 这样前端在请求相应数据的时候，我们就可以直接从 Application
     * 域中获取信息，减少数据库的压力。
     * @param contextRefreshedEvent
     */
    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        // 先获取到 application 上下文
        ApplicationContext context = contextRefreshedEvent.getApplicationContext();
        // 获取对应的 service
        UserInfoService service = context.getBean(UserInfoService.class);
        List<UserInfo> list = service.list();
        list.forEach(l -> {
            System.out.println(l.toString() + "---------------------->>>Listener");
        });
        // 获取 application 域对象，将查到的信息放到 application 域中
        ServletContext application = context.getBean(ServletContext.class);
        application.setAttribute("user-info", list.get(0));
    }
}
